For data storage applications, it is imperative to use error correcting codes (ECC) to provide data integrity. Low density parity check codes (LDPC) and Bose-Chaudhuri-Hocquenghem (BCH) codes are most commonly used for ECC in data storage applications. Use of turbo product codes (TPC) for NAND flash memories has recently been proposed. In some scenarios, turbo product codes outperform BCH and LDPC codes in hard decision decoding performance. In other scenarios, there might be a performance gap in soft decision decoding compared to LDPC codes. Turbo product codes may be decoded with a soft decision decoding algorithm, such as Chase(L) decoding for decoding row and column constituent codes, where L is the number of the least reliable bits used for flipping. The performance gain increases with larger values of L. However, complexity of Chase decoding also increases exponentially with L. There is a need in the art to improve performance of TPC codes in soft decoding with minimal increase in hardware complexity.